//package com.pro.common.modules.service.dependencies.util;
//
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.data.redis.core.ValueOperations;
//import org.springframework.stereotype.Component;
//
//import java.time.LocalDate;
//import java.time.format.DateTimeFormatter;
//import java.util.concurrent.TimeUnit;
//
//@Component
//public class OrderNoGenerator {
//
//    private final StringRedisTemplate redisTemplate;
//    private final OrderRepository orderRepository; // 自己写的查询最大编号的DAO
//
//    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
//
//    public OrderNoGenerator(StringRedisTemplate redisTemplate, OrderRepository orderRepository) {
//        this.redisTemplate = redisTemplate;
//        this.orderRepository = orderRepository;
//    }
//
//    /**
//     * 枚举定义业务编号规则
//     */
//    public enum BizType {
//        ORDER("ORD"),
//        PAYMENT("PAY"),
//        INVOICE("INV");
//
//        private final String prefix;
//
//        BizType(String prefix) {
//            this.prefix = prefix;
//        }
//
//        public String getPrefix() {
//            return prefix;
//        }
//    }
//
//    /**
//     * 生成编号主方法
//     */
//    public String generate(BizType bizType) {
//        String dateStr = LocalDate.now().format(DATE_FORMATTER);
//        String redisKey = "SEQ:" + bizType.name() + ":" + dateStr;
//
//        // 初始化 Redis 序列号（兼容Redis重启或丢失）
//        initRedisSeqIfNeeded(redisKey, bizType, dateStr);
//
//        // Redis 自增获取流水号
//        Long seq = redisTemplate.opsForValue().increment(redisKey);
//
//        // 格式化流水号，比如固定6位，不够前面补0
//        String seqStr = String.format("%06d", seq);
//
//        // 拼接完整订单号
//        return bizType.getPrefix() + dateStr + seqStr;
//    }
//
//    /**
//     * 初始化 Redis 序列号，如果 Redis 中不存在或者值偏小，进行加载
//     */
//    private void initRedisSeqIfNeeded(String redisKey, BizType bizType, String dateStr) {
//        ValueOperations<String, String> ops = redisTemplate.opsForValue();
//
//        String val = ops.get(redisKey);
//        if (val == null || val.isEmpty()) {
//            // 加分布式锁，防止并发初始化（这里简化演示，实际可用Redisson或其他分布式锁组件）
//            synchronized (this) {
//                val = ops.get(redisKey);
//                if (val == null || val.isEmpty()) {
//                    // 从数据库查询该业务类型当天最大流水号数字
//                    Long maxSeq = orderRepository.findMaxSeqByBizTypeAndDate(bizType.name(), dateStr);
//                    if (maxSeq == null) {
//                        maxSeq = 0L;
//                    }
//                    ops.set(redisKey, String.valueOf(maxSeq), 2, TimeUnit.DAYS); // 设置过期，避免旧数据
//                }
//            }
//        }
//    }
//}
